#Fichier ou il aura toutes les classes

ISBNvide = -1 
def ISBN(isbn):
	"""Pour ajouter de facon transparent les ISBN
	Qui sont deux types differents:
	ISBN-10 ==> Ancienne Version
	ISBN-13 et EAN-13 (CodeBarre) ==> Nouvelle Version""" 
	#Changement de representation au cas ou...
	try:
		isbn = str(isbn)
	except:
		"ISBN : Mauvaise forme...."
	else:
		#Traitement de toutes les variates d'ecriture....
		isbn = isbn.replace("-","") 
		isbn = isbn.replace(".","")
		#Le choix entre les ISBN
		if len(isbn)==10:
			return __IsbnPourDix(isbn)
		elif len(isbn)==13:
			return __IsbnPourTreize(isbn)
		else:
			print "ISBN n'a pas ete reconnue"
			return -1  #FIXME: Houlala verifier ca

def conversionEANetISBN13enISBN10(isbn):
	"""Pour cette fonction il nous faut dse isbn en texte ou en int"""
	try:
		isbn = str(isbn)
	except:
		"ISBN : Mauvaise forme...."
	else:
		#Traitement de toutes les variates d'ecriture....
		isbn = isbn.replace("-","") 
		isbn = isbn.replace(".","")
		#On retire ce qui est devant et la cle
		isbn = isbn[3:-1]
		return __convertISBN10(isbn)
	 
class __IsbnPourDix:
	#Constantes de la classe
	ISBNvide = -1 
	
	def __init__(self,isbn):
		"prend un isbn de forme string"
		self.__isbn = self.__traitementISBN(isbn)
		
	def __del__(self):
		del(self)
	
	def __str__(self):
		if (self.testISBNvide(self.__isbn)):
			return "*ISBN vide*"
		else:
			tmp = str(self.__isbn)
			if len(tmp)==10:
				return tmp
			else:
				return tmp[:-2]+'X' 
	
	def __traitementISBN(self,isbn):
		"""__traitementISBN10 : isbn --> (isbn sans cle en int, key en int)
		On s'appuye des connaissance sur les ISBN
		Si on a une erreur dans l'isbn elle nous renvoie le ISBNvide
		ATTETION la cle X est en realite 10"""
		try:
			key = isbn[-1]
			isbn = int(isbn[:-1])
			isbnTmp = isbn
		except:
			print "Erreur dans isbn ... elle doit que comporter d'entier sauf la cle"
			return self.ISBNvide
		else:
			keyCalculee = 0
			for i in range(9):
				keyCalculee = keyCalculee + ((isbn % 10) * (i + 2)) 
				isbn = isbn / 10
			#traitement pour avoir la cle
			keyCalculee = keyCalculee % 11
			keyCalculee = 11 - keyCalculee
			
			#specificite dans l'isbn10
			if key=="X":
				key='10' 
			if keyCalculee==11:
				keyCalculee=0
			#fin des specificite dans l'isbn10
			
			if str(keyCalculee)==key:
				return self.__fusionKeyISBN(isbnTmp,int(key))
			else:
				return self.ISBNvide
			
	def __fusionKeyISBN(self,isbn,key):
		"""Pour fusionner la cle et l'isbn
		pour avoir un simple entier"""
		
		if key < 10:
			return isbn*10 + key
		else:
			return isbn*100 + key
		
	def setISBN(self,isbn):
		self.__init__(isbn)
	
	def getISBN(self,isbn):
		return self.__isbn
	
	def testISBNvide(self,isbn):
		if(isbn==self.ISBNvide):
			return True
		else:
			return False
		
class __convertISBN10:
	
	ISBNvide = -1 
	def __init__(self,isbn):
		self.__isbn = self.__traitementISBN(isbn)
		
	def __del__(self):
		del(self)
	
	def __str__(self):
		if (self.testISBNvide(self.__isbn)):
			return "*ISBN vide*"
		else:
			tmp = str(self.__isbn)
			if len(tmp)==10:
				return tmp
			else:
				return tmp[:-2]+'X' 
	
	def __traitementISBN(self,isbn):
		"""__traitementISBN10 : isbn --> (isbn sans cle en int, key en int)
		On s'appuye des connaissance sur les ISBN
		Si on a une erreur dans l'isbn elle nous renvoie le ISBNvide
		ATTETION la cle X est en realite 10"""
		try:
			isbn = int(isbn)
			isbnTmp = isbn
		except:
			print "Erreur dans isbn ... elle doit que comporter d'entier sauf la cle"
			return self.ISBNvide
		else:
			keyCalculee = 0
			for i in range(9):
				keyCalculee = keyCalculee + ((isbn % 10) * (i + 2)) 
				isbn = isbn / 10
			#traitement pour avoir la cle
			keyCalculee = keyCalculee % 11
			keyCalculee = 11 - keyCalculee
			
			#specificite dans l'isbn10
			if keyCalculee==11:
				keyCalculee=0
			#fin des specificite dans l'isbn10
			return self.__fusionKeyISBN(isbnTmp,keyCalculee)
		
	def __fusionKeyISBN(self,isbn,key):
		"""Pour fusionner la cle et l'isbn
		pour avoir un simple entier"""
		
		if key < 10:
			return isbn*10 + key
		else:
			return isbn*100 + key
		
	def setISBN(self,isbn):
		self.__init__(isbn)
	
	def getISBN(self,isbn):
		return self.__isbn
	
	def testISBNvide(self,isbn):
		if(isbn==self.ISBNvide):
			return True
		else:
			return False
		
	
class __IsbnPourTreize:
	#Constantes de la classe
	ISBNvide = -1 
	
	def __init__(self,isbn):
		"prend un isbn de forme string"
		self.__isbn = self.__traitementISBN(isbn)
		
	def __del__(self):
		del(self)
	
	def __str__(self):
		if (self.testISBNvide(self.__isbn)):
			return "*ISBN vide*"
		else:
			return str(self.__isbn)
	
	def __traitementISBN(self,isbn):
		"""__traitementISBN : isbn --> (isbn sans cle en int, key en int)
		On s'appuye des connaissance sur les ISBN"""
		try:
			key = isbn[-1]
			isbn = int(isbn[:-1])
			isbnTmp = isbn
		except:
			print "Erreur dans isbn ... elle doit comporter que des entiers"
			return self.ISBNvide
		else:
			keyCalculee = 0
			ponderation3 = True
			for i in range(13):
				if ponderation3:
					keyCalculee = keyCalculee + (isbn % 10) * 3 
					ponderation3 = False
				else:
					keyCalculee = keyCalculee + (isbn % 10) 
					ponderation3 = True
				isbn = isbn / 10
			#traitement pour avoir la cle
			keyCalculee = (- keyCalculee) % 10
			#eyCalculee = 11 - keyCalculee
			
			#le test final
			if str(keyCalculee)==key:
				return self.__fusionKeyISBN(isbnTmp,int(key))
			else:
				print "%s - %s" % (str(keyCalculee),key)
				return self.ISBNvide
	
	def __fusionKeyISBN(self,isbn,key):
		"""Pour fusionner la cle et l'isbn
		pour avoir un simple entier"""
		return isbn*10 + key
	
	def setISBN(self,isbn):
		self.__init__(isbn)
	
	def getISBN(self,isbn):
		return self.__isbn
	
	def testISBNvide(self,isbn):
		if(isbn==self.ISBNvide):
			return True
		else:
			return False



class Livre : #FIXME:Code barre ou ISBN choisir
	def __init__(self,titre="",isbn=-1,auteurs=[],collection="") : #TODO: penser valeur initiale ISBN
		self.__isbn = ISBN(isbn) # string
		self.__auteurs = auteurs # list
		self.__titre = titre # string
		self.__collection = collection # string
		pass
	def setTitre (self, nom) :
		# returns void
		self.__titre = nom
	def getTitre (self) :
		# returns string
		return self.__titre
	def setAuteurs (self, auteurs) :
		# returns void
		self.__auteurs = auteurs
	def getAuteurs (self) :
		# returns list
		return self.__auteurs
	def ajoutAuteur (self, auteur) :
		# returns void
		self.__auteurs.append(auteur)
	def retirerAuteur (self, auteur) :
		# returns void
		pass
	def setISBN (self, isbn) :
		# returns void
		self.__isbn = ISBN(isbn)
	def getISBN (self) :
		# returns string
		return self.__isbn
	
	def getCollection(self):
		return self.__collection
	
	def setCollection(self,collection):
		self.__collection = collection

